package servidorbancos.resources;

import com.sun.jersey.api.json.JSONWithPadding;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import servidorbancos.geneticos.AlgoritmoGenetico;
import servidorbancos.redeneural.RedeNeural;

/**
 *
 * @author luiz.perez
 */
@Path("/servidorbancos/agencias")
public class AgenciaResource {

    String[] bancos = {"Banco do Brasil", "Santander", "Itau", "Caixa", "Bradesco", "HSBC", "Banco 24 Horas", "Citibank", "Safra", "Sudameris"};
    ListaAgencias la = new ListaAgencias();
    ArrayList<Agencia> agencias = (ArrayList<Agencia>) la.getListaAgencias();
    RedeNeural rn = new RedeNeural(la.getListaAgencias());

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{banco}")
    public Agencia getAgencia(@PathParam("banco") int banco) {
        for (Agencia x : agencias) {
            if (x.banco == banco) {
                return x;
            }
        }
        return null;
    }

    @GET
    @Produces({MediaType.APPLICATION_JSON})
    public String listaAgencias() {
        String fstring = "";
        int i = 0;
        for (Agencia ag : agencias) {
            if (i == 0) {
                fstring = fstring + "({";
                i++;
            } else {
                fstring = fstring + ",{";
            }


            fstring = fstring + "\"banco\":" + "" + ag.banco + "" + ""
                    + ",\"distancia\" :" + " " + ag.distancia + "" + ""
                    + ",\"lat\" :" + " " + ag.lat + "" + ""
                    + ",\"lon\" :" + " " + ag.lon + "" + ""
                    + ",\"zona\" :" + " " + ag.zona + "" + "";
            ;
            fstring = fstring + "}";

        }
        fstring = fstring + ");";
        return fstring;
    }

    @GET
    @Path("zona/{dados}")
    @Produces("application/javascript")
    public JSONWithPadding getZona(@PathParam("dados") String dados, @QueryParam("jsoncallback") String callback) {
        String[] vals = dados.split(",");
        if (vals.length < 2) {
            return null;
        } else {
            //rn.Treinar();
            String zona = rn.calcula(Double.parseDouble(vals[0]), Double.parseDouble(vals[1]));
            String sRetorno = ("[{zona: \"" + zona + "\"}]");
            return new JSONWithPadding(sRetorno, callback);
        }
    }

    @GET
    @Path("agenciasproximas/{dados}")
    @Produces("application/javascript")
    public JSONWithPadding GetAgenciasProximas(@PathParam("dados") String dados, @QueryParam("jsoncallback") String callback) {
        String[] vals = dados.split(",");
        if (vals.length < 12) {
            return null;
        } else {
            AgenciaUtil au = new AgenciaUtil(agencias, Double.parseDouble(vals[0]), Double.parseDouble(vals[1]));
            //return (ArrayList<Agencia>) au.GetAgenciasProximas(Integer.parseInt(vals[2]), Integer.parseInt(vals[3]), Integer.parseInt(vals[4]), Integer.parseInt(vals[5]), Integer.parseInt(vals[6]), Integer.parseInt(vals[7]), Integer.parseInt(vals[8]), Integer.parseInt(vals[9]), Integer.parseInt(vals[10]), Integer.parseInt(vals[11]));
            String fstring = "";
            int i = 0;
            List<Agencia> listaAgenciasProximas = au.GetAgenciasProximas(Integer.parseInt(vals[2]), Integer.parseInt(vals[3]), Integer.parseInt(vals[4]), Integer.parseInt(vals[5]), Integer.parseInt(vals[6]), Integer.parseInt(vals[7]), Integer.parseInt(vals[8]), Integer.parseInt(vals[9]), Integer.parseInt(vals[10]), Integer.parseInt(vals[11]));

            double[] origem = new double[]{Double.parseDouble(vals[0]), Double.parseDouble(vals[1])};

            if (listaAgenciasProximas == null || listaAgenciasProximas.isEmpty()) {
                return new JSONWithPadding("", "");
            }
            List<Agencia> listaCaminho = getMenorCaminho(origem, listaAgenciasProximas);

            //for(Agencia ag : listaAgenciasProximas)
            for (Agencia ag : listaCaminho) {
                if (i == 0) {
                    fstring = fstring + "[{";
                    i++;
                } else {
                    fstring = fstring + ",{";
                }

                fstring = fstring + "banco: \"" + bancos[ag.banco] + "\""
                        + ",distancia: " + ag.distancia
                        + ",lat: " + ag.lat
                        + ",lon: " + ag.lon
                        + ",zona: " + ag.zona;
                fstring = fstring + "}";

            }
            fstring = fstring + "]";
            return new JSONWithPadding(fstring, callback);
        }
    }

    public List<Agencia> getMenorCaminho(double[] origem, List<Agencia> listaAgencias) {
        List<Agencia> listaMenorCaminho = new ArrayList<Agencia>();
        double vals[] = {-23.686528, -46.700737};        
        AlgoritmoGenetico ag = new AlgoritmoGenetico(vals[0], vals[1], listaAgencias);
        ag.Roda();
        int[] menorCaminho = ag.getMelhorIndividuo();
        for (int i = 1; i < menorCaminho.length-1; i++) {
            listaMenorCaminho.add(listaAgencias.get(menorCaminho[i]-1));
        }
        System.out.println(listaMenorCaminho);
        return listaMenorCaminho;
    }
}
